البرمجة

جالبات وضابطات الخصائص في جافاسكربت

جالبات الخصائص وضابطاتها (Getters and Setters) في جافاسكربت

تعتبر جالبات الخصائص (Getters) وضابطاتها (Setters) في جافاسكربت من الأدوات الفعّالة التي تسمح للمطورين بالتحكم في كيفية وصول وتعديل البيانات داخل الكائنات. هذه الآلية توفر وسيلة للوصول إلى القيم في الكائنات بطريقة آمنة ومرنة، وتُستخدم بشكل رئيسي لضمان حماية البيانات من التغيير المباشر. في هذا المقال، سنتناول مفهوم جالبات الخصائص وضابطاتها في جافاسكربت، وكيفية استخدامها، بالإضافة إلى أهميتها في كتابة شيفرات أكثر احترافية وقابلة للصيانة.

تعريف جالبات الخصائص (Getters)

جالبات الخصائص (Getters) هي دوال مخصصة تُستخدم للوصول إلى قيم الخصائص داخل الكائنات. وهي تختلف عن الوصول المباشر إلى الخصائص من حيث أنها تسمح لك بتنفيذ بعض المنطق أو المعالجة قبل إرجاع القيمة.

في جافاسكربت، يمكن تعريف جالب الخصائص باستخدام الكلمة المفتاحية get، ويُسمح لنا باستخدامه كخاصية، أي أننا يمكننا الوصول إلى القيمة من خلال اسم الخاصية دون الحاجة لاستخدام الأقواس كما في استدعاء الدوال.

طريقة تعريف جالبات الخصائص

يتم تعريف جالب الخصائص داخل الكائنات باستخدام الكلمة المفتاحية get، كالتالي:

javascript
const person = { firstName: 'Ahmed', lastName: 'Ali', get fullName() { return this.firstName + ' ' + this.lastName; } }; console.log(person.fullName); // Output: Ahmed Ali

في المثال أعلاه، قمنا بتعريف خاصية fullName باستخدام جالب خصائص. رغم أنها تُعرض كخاصية، فإننا نستخدم منطقًا داخل الجالب لدمج الاسم الأول والاسم الأخير معًا.

مزايا استخدام جالبات الخصائص
  1. إخفاء التفاصيل الداخلية: يُمكنك معالجة البيانات قبل إرجاعها للمستخدم، مما يسمح لك بالحفاظ على السرية أو التنظيم الداخلي.

  2. المرونة: يتيح لك تعديل الطريقة التي يتم بها الوصول إلى القيم دون التأثير على الكود الذي يستخدم هذه القيم.

  3. الوصول إلى البيانات: يساعد في كتابة كود أكثر وضوحًا وأقل تعقيدًا، حيث يمكنك الوصول إلى القيم بطريقة طبيعية.

تعريف ضابطات الخصائص (Setters)

ضابطات الخصائص (Setters) هي دوال تُستخدم لضبط أو تعديل القيم في الكائنات. يتم استخدام ضابط الخصائص عندما تحتاج إلى إضافة بعض المنطق أو التحقق قبل تعديل القيم. كما هو الحال مع الجالبات، يتم تعريف ضابطات الخصائص باستخدام الكلمة المفتاحية set.

طريقة تعريف ضابطات الخصائص

يتم تعريف ضابط الخصائص داخل الكائنات باستخدام الكلمة المفتاحية set، كالتالي:

javascript
const person = { firstName: 'Ahmed', lastName: 'Ali', set fullName(name) { const nameParts = name.split(' '); this.firstName = nameParts[0]; this.lastName = nameParts[1]; } }; person.fullName = 'Khaled Ahmed'; // تعديل الاسم console.log(person.firstName); // Output: Khaled console.log(person.lastName); // Output: Ahmed

في هذا المثال، عندما نُعدّل خاصية fullName، يقوم الضابط بتقسيم الاسم المقدم إلى جزئين، ثم يعين الأول للاسم الأول (firstName) والآخر للاسم الأخير (lastName).

مزايا استخدام ضابطات الخصائص
  1. التحقق من القيم المدخلة: يسمح لك بالتحقق من صحة القيم قبل تعديل البيانات.

  2. ضمان السلامة: يمكنك إضافة شروط إضافية للتحقق من القيم المدخلة، مثل التأكد من أن البيانات تطابق تنسيقًا معينًا.

  3. المرونة: توفر وسيلة لضبط القيم بطريقة مرنة دون التأثير على الكود الذي يستخدمها.

استخدام الجالبات والضابطات مع الخصائص المحمية

أحد الاستخدامات المتقدمة للجالبات والضابطات هو في التعامل مع الخصائص المحمية (Encapsulation) داخل الكائنات. بمعنى آخر، يمكنك إخفاء البيانات من الوصول المباشر إلى قيم الخصائص الخارجية، مما يساعد في تحقيق عزل البيانات عن بقية أجزاء الكود.

مثال على الخصائص المحمية باستخدام الجالبات والضابطات:

javascript
const person = (function() { let _firstName = ''; let _lastName = ''; return { get firstName() { return _firstName; }, set firstName(name) { if (name.length > 2) { _firstName = name; } }, get lastName() { return _lastName; }, set lastName(name) { if (name.length > 2) { _lastName = name; } }, get fullName() { return `${_firstName} ${_lastName}`; } }; })(); person.firstName = 'Ali'; person.lastName = 'Khan'; console.log(person.fullName); // Output: Ali Khan

في هذا المثال، الخصائص _firstName و _lastName محمية داخل الدالة المجمعة (IIFE)، وبالتالي لا يمكن الوصول إليها مباشرة من خارج الكائن. تُستخدم الجالبات والضابطات للتحكم في كيفية الوصول إلى هذه القيم وتعديلها.

استخدام الجالبات والضابطات في الكائنات المشتقة (Inheritance)

يمكن للجالبات والضابطات أيضًا أن تُستخدم في الوراثة (Inheritance) عبر الكائنات. في جافاسكربت، يمكنك استخدام Object.create() أو بناء فئات (Classes) لتوريث جالبات و ضابطات الخصائص.

مثال على استخدام الجالبات والضابطات مع الفئات:

javascript
class Person { constructor(firstName, lastName) { this._firstName = firstName; this._lastName = lastName; } get firstName() { return this._firstName; } set firstName(name) { this._firstName = name; } get lastName() { return this._lastName; } set lastName(name) { this._lastName = name; } get fullName() { return `${this._firstName} ${this._lastName}`; } } class Employee extends Person { constructor(firstName, lastName, position) { super(firstName, lastName); this.position = position; } get employeeInfo() { return `${this.fullName} - Position: ${this.position}`; } } const employee = new Employee('Sami', 'Omar', 'Software Developer'); console.log(employee.employeeInfo); // Output: Sami Omar - Position: Software Developer

في هذا المثال، تم استخدام الفئة Person مع الجالبات والضابطات للوصول إلى القيم الخاصة بالأسماء. ومن ثم تم توريث هذه الفئة في فئة Employee، التي أضافت خاصية position وفعلت الجلب بطريقة مخصصة لعرض معلومات الموظف.

الفرق بين الجالبات والضابطات مع الخصائص العادية

بينما تُستخدم الجالبات والضابطات للتحكم في كيفية الوصول إلى وتعديل البيانات داخل الكائنات، يمكن الوصول إلى الخصائص العادية (غير المدارة) مباشرة. على سبيل المثال:

javascript
const person = { firstName: 'Ali', lastName: 'Ahmed' }; console.log(person.firstName); // Output: Ali

في هذا المثال، يتم الوصول مباشرة إلى خاصية firstName دون الحاجة لاستخدام جالب أو ضابط.

الفرق الأساسي بين الجالبات والضابطات والخصائص العادية هو أن الجالبات والضابطات تسمح بتطبيق منطق إضافي عند الوصول إلى أو تعديل الخصائص، بينما في الخصائص العادية لا توجد أي عملية تحقق أو منطق إضافي.

خلاصة

الجالبات والضابطات (Getters and Setters) في جافاسكربت هما أدوات قوية توفر مرونة في التحكم في كيفية الوصول إلى وتعديل البيانات داخل الكائنات. يمكن استخدام الجالبات للحصول على القيم بطريقة أكثر أمانًا ومرونة، بينما يمكن استخدام الضابطات لتعديل القيم مع تطبيق المنطق أو التحقق من صحتها. توفر هذه الأدوات آلية فعالة لتحقيق الكبسلة (Encapsulation)، وتساعد في كتابة أكواد أكثر نظافة وقابلية للصيانة.

بالإضافة إلى ذلك، يمكن للجالبات والضابطات أن تُستخدم في الوراثة أو في الكائنات المعقدة لضمان أمان البيانات وحمايتها من التعديلات غير المرغوب فيها.